"""
Problem 55: https://projecteuler.net/problem=55

Lychrel numbers

If we take 47, reverse and add, 47 + 74 = 121, which is palindromic.

Not all numbers produce palindromes so quickly. For example,
349 + 943 = 1292,
1292 + 2921 = 4213
4213 + 3124 = 7337
That is, 349 took three iterations to arrive at a palindrome.

Although no one has proved it yet, it is thought that some numbers, like 196,
never produce a palindrome. A number that never forms a palindrome through the
reverse and add process is called a Lychrel number. Due to the theoretical nature
of these numbers, and for the purpose of this problem, we shall assume that a number
is Lychrel until proven otherwise. In addition you are given that for every number
below ten-thousand, it will either (i) become a palindrome in less than fifty
iterations, or, (ii) no one, with all the computing power that exists, has managed
so far to map it to a palindrome. In fact, 10677 is the first number to be shown
to require over fifty iterations before producing a palindrome:
4668731596684224866951378664 (53 iterations, 28-digits).

Surprisingly, there are palindromic numbers that are themselves Lychrel numbers;
the first example is 4994.
How many Lychrel numbers are there below ten-thousand?
"""

# _*_ conding:UTF-8 _*_
'''
@author = Kuperain
@email = kuperain@aliyun.com
@IDE = VSCODE Python3.8.3
@creat_time = 2022/5/18
'''



def isPalindromicNumber(n: int) -> bool:
    '''
    >>> assert isPalindromicNumber(1)
    >>> assert isPalindromicNumber(22)
    >>> assert isPalindromicNumber(121)
    >>> assert not isPalindromicNumber(110)
    >>> assert not isPalindromicNumber(1223)
    '''

    if n % 10 == 0:
        return False

    ns = str(n)
    halflens = len(ns)//2
    for i in range(halflens):
        if ns[i] != ns[-(i+1)]:
            return False
    return True


def reverseadd(n: int) -> int:
    return n + int(str(n)[::-1])


def isLychrelNumber(n: int, timeslimit: int = 50) -> bool:
    '''
    >>> assert isLychrelNumber(196)
    >>> assert isLychrelNumber(10677)
    >>> assert isLychrelNumber(4994)
    '''

    times = 0

    while times < timeslimit:
        n = reverseadd(n)
        if isPalindromicNumber(n):
            return False
        times += 1
    # print(n)
    return True


def solution(nlimit: int = 10000) -> int:

    count = 0

    for i in range(1, nlimit):
        if isLychrelNumber(i):
            count += 1

    return count


if __name__ == "__main__":
    import doctest
    doctest.testmod(verbose=False)

    print(solution())
    # 249
